package com.example.cybz.common.result;


import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Builder;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.http.HttpStatus;

import java.io.Serializable;
import java.time.Instant;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

/**
 * 统一API响应结果封装
 *
 * @param <T> 数据类型
 */
@Data
@Builder
@Accessors(chain = true) // 支持链式调用
@ApiModel(description = "统一API响应结构")
public class Result<T> implements Serializable {
    private static final long serialVersionUID = 1905122041950251207L;


    // ================= 核心字段 =================
    @ApiModelProperty(value = "状态码", required = true, example = "200")
    private Integer code;

    @ApiModelProperty(value = "业务消息", example = "操作成功")
    private String message;

    @ApiModelProperty(value = "响应数据")
    private T data;

    // ================= 增强字段 =================
    @ApiModelProperty(value = "时间戳(毫秒)", example = "1662105600000")
    @Builder.Default
    private Long timestamp = Instant.now().toEpochMilli();

    @ApiModelProperty(value = "请求路径", example = "/api/users")
    private String path;

    @ApiModelProperty(value = "链路追踪ID", example = "d4e5f6a7b8c9")
    private String traceId;

    @ApiModelProperty(value = "附加元数据")
    @Builder.Default
    private Map<String, Object> metadata = new HashMap<>();

    // ================= 分页支持 =================
    @ApiModelProperty(value = "分页信息")
    private Pagination pagination;

    /**
     * 分页信息封装类
     */
    @Data
    @Builder
    @ApiModel(description = "分页信息")
    public static class Pagination implements Serializable{
        @ApiModelProperty(value = "当前页码", example = "1")
        private Integer current;

        @ApiModelProperty(value = "每页数量", example = "10")
        private Integer pageSize;

        @ApiModelProperty(value = "总记录数", example = "100")
        private Long total;

        @ApiModelProperty(value = "总页数", example = "10")
        private Integer pages;
    }

    // ================= 成功响应快捷方法 =================

    /**
     * 操作成功（无数据）
     */
    public static <T> Result<T> ok() {
        return Result.<T>builder()
                .code(ResultCodeEnum.SUCCESS.getCode())
                .message(ResultCodeEnum.SUCCESS.getMessage())
                .build();
    }

    /**
     * 操作成功（带数据）
     */
    public static <T> Result<T> ok(T data) {
        return Result.<T>builder()
                .code(ResultCodeEnum.SUCCESS.getCode())
                .message(ResultCodeEnum.SUCCESS.getMessage())
                .data(data)
                .build();
    }

    /**
     * 操作成功（自定义消息）
     */
    public static <T> Result<T> ok(String message) {
        return Result.<T>builder()
                .code(ResultCodeEnum.SUCCESS.getCode())
                .message(message)
                .build();
    }

    /**
     * 操作成功（带数据+自定义消息）
     */
    public static <T> Result<T> ok(T data, String message) {
        return Result.<T>builder()
                .code(ResultCodeEnum.SUCCESS.getCode())
                .message(message)
                .data(data)
                .build();
    }

    /**
     * 操作成功（分页数据）
     */
    public static <T> Result<T> page(T data, Pagination pagination) {
        return Result.<T>builder()
                .code(ResultCodeEnum.SUCCESS.getCode())
                .message(ResultCodeEnum.SUCCESS.getMessage())
                .data(data)
                .pagination(pagination)
                .build();
    }

    // ================= 失败响应快捷方法 =================

    /**
     * 操作失败（默认错误码）
     */
    public static <T> Result<T> fail() {
        return Result.<T>builder()
                .code(ResultCodeEnum.FAIL.getCode())
                .message(ResultCodeEnum.FAIL.getMessage())
                .build();
    }

    /**
     * 操作失败（自定义消息）
     */
    public static <T> Result<T> fail(String message) {
        return Result.<T>builder()
                .code(ResultCodeEnum.FAIL.getCode())
                .message(message)
                .build();
    }

    /**
     * 操作失败（错误码+错误消息）
     */
    public static <T> Result<T> fail(Integer code, String message) {
        return Result.<T>builder()
                .code(code)
                .message(message)
                .build();
    }

    /**
     * 操作失败（错误码枚举）
     */
    public static <T> Result<T> fail(ResultCodeEnum resultCode) {
        return Result.<T>builder()
                .code(resultCode.getCode())
                .message(resultCode.getMessage())
                .build();
    }

    /**
     * 操作失败（错误码枚举+自定义消息）
     */
    public static <T> Result<T> fail(ResultCodeEnum resultCode, String customMessage) {
        return Result.<T>builder()
                .code(resultCode.getCode())
                .message(customMessage)
                .build();
    }

    /**
     * 操作失败（错误码枚举+详细数据）
     */
    public static <T> Result<T> fail(ResultCodeEnum resultCode, T errorData) {
        return Result.<T>builder()
                .code(resultCode.getCode())
                .message(resultCode.getMessage())
                .data(errorData)
                .build();
    }

    // ================= 便捷状态判断方法 =================

    /**
     * 判断响应是否成功
     */
    public boolean isSuccess() {
        return ResultCodeEnum.SUCCESS.getCode().equals(this.code);
    }

    /**
     * 判断响应是否失败
     */
    public boolean isFail() {
        return !isSuccess();
    }

    // ================= 元数据操作方法 =================

    /**
     * 添加元数据
     */
    public Result<T> addMetadata(String key, Object value) {
        if (this.metadata == null) {
            this.metadata = new HashMap<>();
        }
        this.metadata.put(key, value);
        return this;
    }

    /**
     * 批量添加元数据
     */
    public Result<T> addMetadata(Map<String, Object> metadata) {
        if (this.metadata == null) {
            this.metadata = new HashMap<>();
        }
        this.metadata.putAll(metadata);
        return this;
    }

    // ================= 异常转换方法 =================

    /**
     * 从异常创建错误响应
     */
    public static <T> Result<T> error(Throwable e) {
        return Result.<T>builder()
                .code(ResultCodeEnum.SYSTEM_ERROR.getCode())
                .message(e.getMessage())
                .build();
    }

    /**
     * 从异常创建错误响应（带错误码）
     */
    public static <T> Result<T> error(ResultCodeEnum resultCode, Throwable e) {
        return Result.<T>builder()
                .code(resultCode.getCode())
                .message(e.getMessage())
                .build();
    }

    // ================= HTTP状态码兼容方法 =================

    /**
     * 创建HTTP状态响应（兼容Spring的HttpStatus）
     */
    public static <T> Result<T> status(HttpStatus status) {
        return Result.<T>builder()
                .code(status.value())
                .message(status.getReasonPhrase())
                .build();
    }

    /**
     * 创建HTTP状态响应（带数据）
     */
    public static <T> Result<T> status(HttpStatus status, T data) {
        return Result.<T>builder()
                .code(status.value())
                .message(status.getReasonPhrase())
                .data(data)
                .build();
    }

    // ================= 空数据处理 =================

    /**
     * 创建空数据成功响应（防止前端处理null）
     */
    public static <T> Result<T> empty() {
        return Result.<T>builder()
                .code(ResultCodeEnum.SUCCESS.getCode())
                .message(ResultCodeEnum.SUCCESS.getMessage())
                .data((T) Collections.emptyMap())
                .build();
    }
}
